#!/bin/bash

#|***************************************
#|------脚本说明
#|------1）本脚本用于支持带有版本后缀的jar包停掉，格式为：{基础名称}-{版本号}.jar，如myapp-1.0.jar、myapp-2.3.1.jar、myapp-3.0-SNAPSHOT.jar
#|------2）不支持不带后缀版本号的jar包，如：myapp.jar 、  myapp-1.0-executable.jar 
#|***************************************


#----------------1.启动参数
# 指定环境
export SPRING_PROFILES_ACTIVE=prod
# 应用基本名称、端口
APP_BASE_NAME="qia-hao"
APP_PORT=8888 
# 等待进程停止的最大秒数                 
TIMEOUT=30                      

# 查找进程ID的函数
find_pid() {
  # 通过JAR名称查找
  JAR_PID=$(ps -ef | grep "java.*${APP_BASE_NAME}" | grep -v grep | awk '{print $2}')
  
  # 通过端口查找
  PORT_PID=$(lsof -t -i:$APP_PORT)
  
  # 合并结果，去重（sort -u只能按行统计，因此这里使用 tr ' ' '\n' 将空格替换成换行符）
  PID_LIST=$(echo "$JAR_PID $PORT_PID" | tr ' ' '\n' | sort -u)
  echo $PID_LIST
}

# 查找进程
PIDS=$(find_pid)

if [ -z "$PIDS" ]; then
  echo "[INFO] 应用 $APP_BASE_NAME 未运行"
  exit 0
fi

echo "找到运行中的进程: $PIDS"

# 停止进程
echo "正在停止应用 $APP_BASE_NAME ..."
for PID in $PIDS; do
  kill -15 $PID
done

# 等待进程停止
count=0
while [ $count -lt $TIMEOUT ]; do
  remaining=$(find_pid)
  if [ -z "$remaining" ]; then
    break
  fi
  echo "等待进程停止... (${count}/${TIMEOUT}s)"
  sleep 1
  ((count++))
done

# 检查是否完全停止
REMAINING_PIDS=$(find_pid)
if [ -n "$REMAINING_PIDS" ]; then
  echo "[WARNING] 进程未在 ${TIMEOUT}秒 内停止，强制终止"
  kill -9 $REMAINING_PIDS
  sleep 2
fi

# 最终确认
if [ -z "$(find_pid)" ]; then
  echo "[SUCCESS] 应用已停止"
else
  echo "[ERROR] 停止应用失败，剩余进程: $(find_pid)"
  exit 1
fi